/******************************************************************************* * Copyright (c) 2004, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.themes; import java.util.ResourceBundle; import java.util.Set; import org.eclipse.core.commands.common.EventManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.ColorRegistry; import org.eclipse.jface.resource.DataFormatException; import org.eclipse.jface.resource.FontRegistry; import org.eclipse.jface.resource.StringConverter; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferenceConstants; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.util.PrefUtil; import org.eclipse.ui.internal.util.Util; import org.eclipse.ui.themes.ITheme; import org.eclipse.ui.themes.IThemeManager; /** */ public class Theme extends EventManager implements ITheme { /** * The translation bundle in which to look up internationalized text. */ private final static ResourceBundle RESOURCE_BUNDLE = ResourceBundle .getBundle(Theme.class.getName()); private CascadingColorRegistry themeColorRegistry; private CascadingFontRegistry themeFontRegistry; private IThemeDescriptor descriptor; private IPropertyChangeListener themeListener; private CascadingMap dataMap; private ThemeRegistry themeRegistry; private IPropertyChangeListener propertyListener; /** * @param descriptor */ public Theme(IThemeDescriptor descriptor) { themeRegistry = ((ThemeRegistry) WorkbenchPlugin.getDefault() .getThemeRegistry()); this.descriptor = descriptor; IWorkbench workbench = PlatformUI.getWorkbench(); if (descriptor != null) { ITheme defaultTheme = workbench.getThemeManager().getTheme( IThemeManager.DEFAULT_THEME); ColorDefinition[] colorDefinitions = this.descriptor.getColors(); themeColorRegistry = new CascadingColorRegistry(defaultTheme .getColorRegistry()); if (colorDefinitions.length > 0) { ThemeElementHelper.populateRegistry(this, colorDefinitions, PrefUtil.getInternalPreferenceStore()); } FontDefinition[] fontDefinitions = this.descriptor.getFonts(); themeFontRegistry = new CascadingFontRegistry(defaultTheme .getFontRegistry()); if (fontDefinitions.length > 0) { ThemeElementHelper.populateRegistry(this, fontDefinitions, PrefUtil.getInternalPreferenceStore()); } dataMap = new CascadingMap(((ThemeRegistry) WorkbenchPlugin .getDefault().getThemeRegistry()).getData(), descriptor .getData()); } getColorRegistry().addListener(getCascadeListener()); getFontRegistry().addListener(getCascadeListener()); PrefUtil.getInternalPreferenceStore().addPropertyChangeListener( getPropertyListener()); } /** * Listener that is responsible for responding to preference changes. * * @return the property change listener */ private IPropertyChangeListener getPropertyListener() { if (propertyListener == null) { propertyListener = new IPropertyChangeListener() { /* (non-Javadoc) * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent event) { String[] split = ThemeElementHelper.splitPropertyName( Theme.this, event.getProperty()); String key = split[1]; String theme = split[0]; if (key.equals(IWorkbenchPreferenceConstants.CURRENT_THEME_ID)) { return; } try { String thisTheme = getId(); if (Util.equals(thisTheme, theme)) { if (getFontRegistry().hasValueFor(key)) { FontData[] data = PreferenceConverter .basicGetFontData((String) event .getNewValue()); getFontRegistry().put(key, data); processDefaultsTo(key, data); return; } else if (getColorRegistry().hasValueFor(key)) { RGB rgb = StringConverter.asRGB((String) event .getNewValue()); getColorRegistry().put(key, rgb); processDefaultsTo(key, rgb); return; } } } catch (DataFormatException e) { //no-op } } /** * Process all fonts that default to the given ID. * * @param key the font ID * @param fd the new FontData for defaulted fonts */ private void processDefaultsTo(String key, FontData[] fd) { FontDefinition[] defs = WorkbenchPlugin.getDefault() .getThemeRegistry().getFontsFor(getId()); for (int i = 0; i < defs.length; i++) { String defaultsTo = defs[i].getDefaultsTo(); if (defaultsTo != null && defaultsTo.equals(key)) { IPreferenceStore store = WorkbenchPlugin .getDefault().getPreferenceStore(); if (store.isDefault(ThemeElementHelper .createPreferenceKey(Theme.this, defs[i] .getId()))) { getFontRegistry().put(defs[i].getId(), fd); processDefaultsTo(defs[i].getId(), fd); } } } } /** * Process all colors that default to the given ID. * * @param key the color ID * @param rgb the new RGB value for defaulted colors */ private void processDefaultsTo(String key, RGB rgb) { ColorDefinition[] defs = WorkbenchPlugin.getDefault() .getThemeRegistry().getColorsFor(getId()); for (int i = 0; i < defs.length; i++) { String defaultsTo = defs[i].getDefaultsTo(); if (defaultsTo != null && defaultsTo.equals(key)) { IPreferenceStore store = WorkbenchPlugin .getDefault().getPreferenceStore(); if (store.isDefault(ThemeElementHelper .createPreferenceKey(Theme.this, defs[i] .getId()))) { getColorRegistry().put(defs[i].getId(), rgb); processDefaultsTo(defs[i].getId(), rgb); } } } } }; } return propertyListener; } /** * Listener that is responsible for rebroadcasting events fired from the base font/color registry */ private IPropertyChangeListener getCascadeListener() { if (themeListener == null) { themeListener = new IPropertyChangeListener() { /* (non-Javadoc) * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent event) { firePropertyChange(event); } }; } return themeListener; } public ColorRegistry getColorRegistry() { if (themeColorRegistry != null) { return themeColorRegistry; } return WorkbenchThemeManager.getInstance() .getDefaultThemeColorRegistry(); } public FontRegistry getFontRegistry() { if (themeFontRegistry != null) { return themeFontRegistry; } return WorkbenchThemeManager.getInstance() .getDefaultThemeFontRegistry(); } public void dispose() { if (themeColorRegistry != null) { themeColorRegistry.removeListener(themeListener); themeColorRegistry.dispose(); } if (themeFontRegistry != null) { themeFontRegistry.removeListener(themeListener); themeFontRegistry.dispose(); } PrefUtil.getInternalPreferenceStore() .removePropertyChangeListener(getPropertyListener()); } /* (non-Javadoc) * @see org.eclipse.ui.internal.themes.ITheme#getId() */ public String getId() { return descriptor == null ? IThemeManager.DEFAULT_THEME : descriptor .getId(); } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbench#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) */ public void addPropertyChangeListener(IPropertyChangeListener listener) { addListenerObject(listener); } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbench#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) */ public void removePropertyChangeListener(IPropertyChangeListener listener) { removeListenerObject(listener); } private void firePropertyChange(PropertyChangeEvent event) { Object[] listeners = getListeners(); for (int i = 0; i < listeners.length; i++) { ((IPropertyChangeListener) listeners[i]).propertyChange(event); } } /* (non-Javadoc) * @see org.eclipse.ui.internal.themes.ITheme#getLabel() */ public String getLabel() { return descriptor == null ? RESOURCE_BUNDLE .getString("DefaultTheme.label") : descriptor.getName(); //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.ui.themes.ITheme#getString(java.lang.String) */ public String getString(String key) { if (dataMap != null) { return (String) dataMap.get(key); } return (String) themeRegistry.getData().get(key); } /* (non-Javadoc) * @see org.eclipse.ui.themes.ITheme#keySet() */ public Set keySet() { if (dataMap != null) { return dataMap.keySet(); } return themeRegistry.getData().keySet(); } /* (non-Javadoc) * @see org.eclipse.ui.themes.ITheme#getInt(java.lang.String) */ public int getInt(String key) { String string = getString(key); if (string == null) { return 0; } try { return Integer.parseInt(string); } catch (NumberFormatException e) { return 0; } } /* (non-Javadoc) * @see org.eclipse.ui.themes.ITheme#getBoolean(java.lang.String) */ public boolean getBoolean(String key) { String string = getString(key); if (string == null) { return false; } return Boolean.valueOf(getString(key)).booleanValue(); } }